perm filename PK[HAK,HPM]1 blob sn#100306 filedate 1974-08-30 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00005 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE PK
C00007 00003	DEVNAM←←0
C00012 00004	BUFPNT:	MOVE E,DEVCHR(DDB)
C00019 00005	SIXOUT:	MOVEI C,6
C00021 ENDMK
C⊗;
	TITLE PK

A←1
B←2
C←3
D←4
E←5
F←6
G←7
H←10
Z←11
DAT←12
SPACE←13
DDB←14
PTR←15
I←16
P←17

CR←←15  LF←←12  TAB←←11  BS←←177  ALT←←175

PDLLEN←←100

TTYTAB←←220
LINTAB←←302
PTYJOB←←270
JOBNAM←←225

DEFINE PEEK(AC,ADDR)
<	MOVEI AC,ADDR
	CALL AC,['PEEK  ']
>

LOC 124
REE
RELOC

PDL:	BLOCK PDLLEN

STRT:	RESET
	OUTSTR[ASCIZ/TTY #?/]
	PEEK A,221		;get numbers of: teletypes, IIIs, DDs, PTYs
	MOVE B,[POINT 9,A]
	SETZM MAXTTY#
	ILDB C,B
	ADDM C,MAXTTY		;add up total number of TTYs
	TLNE B,770000
	JRST .-3
	movni	a,1
	setprv	a,
	tlnn	a,1
	exit
	SETZ A,
INLOP:	INCHWL B		;read in TTY number
	CAIN B,15
	JRST INLOP
	CAIL B,"0"
	CAILE B,"7"
	JRST LAST
	IMULI A,10
	ADDI A,-60(B)
	JRST INLOP
LAST:	CAMGE A,MAXTTY
	CAIE B,12
	JRST [	CLRBFI
		OUTSTR[ASCIZ/HO HO!
/]
		JRST STRT]
	MOVEM A,TABENT#
	MOVEM A,LINENT#
	MOVEM A,LINNBR#		;SAVE TTY LINE NUMBER
	SUBI A,121
	MOVEM A,PTYENT#
	PEEK A,TTYTAB
	ADDM A,TABENT		;LOC OF TTYTAB ENTRY FOR TTY OF INTEREST
	PEEK A,LINTAB
	ADDM A,LINENT		;LOC OF LINTAB ENTRY
	PEEK A,PTYJOB
	SKIPGE PTYENT		;SKIP IF TTY IS NOT A PTY
	JRST REE
	ADDM A,PTYENT
	PEEK A,JOBNAM
	MOVEM A,JOBTAB#
REE:	PEEK A,37		;GET RMEMSIZ-1
	HRLZ A,A
	JUMPGE A,.+2
	HRRI A,540000
	CALL A,['SETPR2']
	HALT STRT
	MOVEI A,-400000(A)
	MOVNM A,TENADR#
	SPCWAR 'SSW'
	SETZM YET
	SETZM DONE
	SETO A,
	GETLIN A
	CAME A,[-1]
	TLNN A,420000
	JRST [	SETOM NODPY#
		MOVEI A,=69
		MOVEM A,MAXCOL		;SET MAX LINE LENGTH
		SETZM MINCOL		;NO MIN LINE LENGTH ON TTYS
		MOVE A,[400000,,SPW]	; WE ARE ON A TELETYPE--DO IT ONLY ONCE
		SPCWGO A,
		OUTSTR HEADER
		OUTSTR TEXT
		EXIT]
	SETZM NODPY		;NODPY INDICATES KIND OF TTY WE ARE ON:
	TLNE A,20000		; -1 FOR TELETYPES, 0 FOR IIIs, <0,,-1> FOR DDs
	HLLOS NODPY
	MOVEI A,=82
	MOVEM A,MAXCOL#		;SET MAX LINE LENGTH
	MOVEI A,10
	SKIPG NODPY
	MOVEI A,7		;7 FOR IIIs, 8 FOR DDs
	MOVEM A,MINCOL#		;SET MIN LINE LENGTH
	SKIPE NODPY
	JRST [	MOVE A,DDWRD1	;WE ARE ON A DD--SET UP CMD WORDS
		MOVEM A,DPYBUF
		MOVE A,DDWRD2
		MOVEM A,LINSET
		JRST WRDDON]
	MOVE A,IIIWRD		;WE ARE ON A III--SET UP POSITION WORD
	MOVEM A,LINSET
WRDDON:	MOVE A,[400017,,SPW]
	SPCWGO A,		;START SPACEWAR ON PDP-10
	PPSEL 1			;SHUT OFF PAGE PRINTER
	SKIPE NODPY
	JRST WRDD1
	DPYSIZ 2002
	DPYPOS -600
WRDD1:	SNEAKW			;WAIT FOR A CHARACTER
	ANDI	177
	CAIL	"0"
	CAILE	"9"
	JRST	.+2
	JRST	STRT
	CAIN	11
	JRST	[INCHRW↔JRST WRDD1]
	CAIE	ALT
	CAIN	LF
	JRST	READ1
	CAIE	CR
	JRST	READ0
	INCHRW
READ1:	INCHRW
READ0:	PPSEL	0
	PGACT
	EXIT	1,
	JRST	REE
DEVNAM←←0
DEVCHR←←1
DEVIOS←←2
DEVMOD←←4
DEVLOG←←5
DEVBUF←←6
ACTBTS←←11
TTIBUF←←16
TTOBUF←←25
TISYNC←←24

BUF←←0
PUTR←←1
TAKR←←3

DEFINE INC(N)
<	REPEAT N,<IDPB SPACE,PTR
>>

DEFINE PUT(CHR)
<	MOVEI A,CHR
	IDPB A,PTR
>

SPW:	AOSL YET#
	SKIPE DONE
	DISMIS			;NOT DONE YET
	MOVNI A,4
	MOVEM A,YET		;DISMISS IMMEDIATELY 3 OUT OF 4 TIMES SPW IS RUN
	SETZM LINENO		;NUMBER OF OUTPUT LINES GENERATED FROM BUFFER
	MOVE P,[IOWD PDLLEN,PDL];GET STACK
DOIT:	CONSZ 40		;6 OR 10?
	JRST [	MOVE I,TENADR	;10 IS EASY!
		JRST TENWIN]
	TLO 2,777000		;INFINITE PROT.
	DATAO 2			;SET IT
	MOVNS I,2		;GET INDEX
TENWIN:	MOVE PTR,[POINT 7,TEXT]	;BYTE POINTER FOR TEXT
	MOVEI SPACE,40
	MOVE DDB,TABENT		;GET LOC OF TTY'S TTYTAB ENTRY
	ADDI DDB,(I)		;UNRELOCATE IT
	MOVE DDB,(DDB)		;GET DDB ADDRESS FROM TTYTAB
	JUMPE DDB,NODDB
	ADDI DDB,(I)		;ADDRESS OF DDB
	MOVE B,DEVNAM(DDB)	;DEVICE NAME
	PUSHJ P,SIXOUT
	INC 2
	MOVE B,DEVLOG(DDB)
	PUSHJ P,SIXOUT
	INC 2
	MOVE B,DEVCHR(DDB)
	PUSHJ P,OCTPNT
	INC 2
	MOVE B,DEVIOS(DDB)
	PUSHJ P,OCTPNT
	INC 2
	MOVE B,DEVMOD(DDB)
	PUSHJ P,OCTPNT
	INC 2
	MOVE B,LINENT		;GET LOC OF TTY'S LINTAB ENTRY
	ADDI B,(I)
	MOVE B,(B)		;GET LINE CHARACTERISTICS
	PUSHJ P,OCTPNT
	SKIPL PTYENT
	JRST DOPTYJ
	MOVEI B,[ASCIZ/ 
/]
	PUSHJ P,STRING
	JRST PTDONE
DOPTYJ:	MOVEI B,[ASCIZ/
PTYJOB:  /]
	PUSHJ P,STRING
	MOVE B,PTYENT
	ADDI B,(I)
	MOVE A,(B)
	PUSH P,A
	PUSHJ P,DECNUM
	MOVEI B,[ASCIZ/  /]
	PUSHJ P,STRING
	POP P,A
	ADD A,JOBTAB
	ADDI A,(I)
	MOVE B,(A)
	PUSHJ P,SIXOUT
PTDONE:	MOVEI B,[ASCIZ/ 
ACTBITS:        /]
	PUSHJ P,STRING
	MOVE B,ACTBTS(DDB)
	PUSHJ P,OCTPNT
	INC 2
	MOVE B,ACTBTS+1(DDB)
	PUSHJ P,OCTPNT
	INC 2
	MOVE B,ACTBTS+2(DDB)
	PUSHJ P,OCTPNT
	INC 2
	MOVE B,ACTBTS+3(DDB)
	PUSHJ P,OCTPNT
	MOVEI B,[ASCIZ/ 
TISYNC:  /]
	PUSHJ P,STRING
	SKIPL TISYNC(DDB)
	JRST NOTNEG
	PUT "-"
NOTNEG:	MOVM A,TISYNC(DDB)
	PUSHJ P,OCTNUM
;	SKIPE FLAG		;DOING INPUT BUFFER OR OUTPUT BUFFER?
;	JRST NOTIN		;OUTPUT
	MOVEI B,[ASCIZ/ 
 
INPUT BUFFER:
/]
	PUSHJ P,STRING
	MOVEI DAT,TTIBUF(DDB)
	PUSHJ P,BUFPNT
;	JRST NOTOUT
NOTIN:	MOVEI B,[ASCIZ/ 
 
OUTPUT BUFFER:
/]
	PUSHJ P,STRING
	MOVEI DAT,TTOBUF(DDB)
	PUSHJ P,BUFPNT
NOTOUT:	SKIPG NODPY		;PUT OUT BLANK LINES IF DD OUTPUT
	JRST NOTOU1
	MOVEI A,=40-=11		;NUMBER OF LINES ON DD SCREEN-NBR USED FOR TITLES
	SUB A,LINENO		;CALC NUMBER OF BLANK LINES NEEDED
	PUSHJ P,PSCRLF		;PUT OUT BLANK LINE WITH ONLY A SPACE ON IT
	SOJG A,.-1
NOTOU1:	JRST 2,@[.+1]
	MOVEI A,2(PTR)
	SUBI A,DPYBUF		;CALC WORD COUNT
	MOVEM A,HEAD+1
	MOVEI A,1
	IORM A,@LASTCLOBBERED#
	SETZM 1(PTR)
	MOVEI A,1(PTR)
	MOVEM A,LASTCLOBBERED
	SKIPL NODPY
	DPYOUT HEAD
	DISMIS

NODDB:	MOVE B,LINNBR		;PRINT LINE NUMBER
	PUSHJ P,OCTPNT
	MOVEI A,=46
	IDPB SPACE,PTR
	SOJG A,.-1
	MOVE B,LINENT		;GET LOC OF TTY'S LINTAB ENTRY
	ADDI B,(I)
	MOVE B,(B)		;GET LINE CHARACTERISTICS
	PUSHJ P,OCTPNT
	MOVEI B,[ASCIZ/ 
 
 
 
 
****** NO DDB POINTER ******
/]
	PUSHJ P,STRING
	JRST NOTOUT
BUFPNT:	MOVE E,DEVCHR(DDB)
	ANDI E,3777		;GET BUFFER SIZE
	ADD E,BUF(DAT)
	ADDI E,(I)
	HRRZM E,STOPR#		;ADDRESS OF END OF BUFFER
	MOVE F,PUTR(DAT)
	ADDI F,(I)
	TLZ F,1
	MOVEM F,SPUTR#		;PUTR
	MOVE A,TAKR(DAT)
	ADDI A,(I)
	TLZ A,1
	MOVEM A,STAKR#		;TAKR
	MOVEI C,13		;SYMBOL FOR CONTROL BIT
	MOVEI D,14		;SYMBOL FOR META BIT
	MOVEI G,177
	SETZB H,SPECIAL#	;H IS COLUMN POSITION, SPECIAL IS A FLAG FOR CR/LF
	SKIPL NODPY		;ON TTY?
	JRST TLOP
	MOVEI C,"$"		;YES, USE DIFFERENT SYMBOLS FOR CONTROL AND META
	MOVEI D,"%"
TLOP:	IBP F
	HRRZ A,F
	CAML A,STOPR		;HAVE WE RUN OFF END OF BUFFER?
	JRST [	HRR F,BUF(DAT)	;YES--MOVE BACK TO FRONT OF BUFFER
		ADDI F,1(I)
		TLZ F,1
		HRRZ A,SPUTR
		CAIGE A,(F)	;PUTR AT FRONT?
		POPJ P,		;YES!
		JRST .+1]
	LDB A,F			;GET A CHAR
	MOVE B,A		;COPY IT WITHOUT CONTROL BITS
	ANDI B,177
	CAML H,MAXCOL#		;LINE TOO LONG?
	PUSHJ P,PCRLF		;YES--PUT OUT CRLF
	SKIPGE NODPY		;SKIP UNLESS TTY
	JRST TTYSPE
	CAIE B,LF
	CAIN B,CR
	JRST [	SETOM SPECIAL	;got a cr or a lf
		PUSHJ P,CTRLBT	;PUT OUT CONTROL AND META BITS IF ON
		SKIPG NODPY	;SKIP IF DD
		JRST IIISPE
		JRST DDSPE]
	SKIPL SPECIAL#		;WAS LAST CHAR A CR OR LF?
	JRST NOTSPE		;NO
	CAML H,MINCOL#		;YES--TOO LITTLE ON THIS LINE?
	PUSHJ P,PCRLF		;NO--PUT OUT CRLF
	SETZM SPECIAL
NOTSPE:	PUSHJ P,CTRLBT		;PUT OUT CONTROL AND META BITS IF ON
	SKIPG NODPY		;SKIP IF DD
	JRST IIISP1
	CAIE B,TAB
	CAIN B,BS
DDSPE:	IDPB G,PTR		;PUT OUT A 177
DDSPE1:	IDPB B,PTR		;PUT OUT CHAR FROM BUFFER
	AOJA H,NODD

IIISPE:	CAIN B,CR
	MOVEI B,"|"		;CR BECOMES VERTICAL BAR
	CAIN B,LF
	MOVEI B,"↓"		;LF BECOMES DOWN ARROW
	JRST DDSPE1

IIISP1:	CAIN B,TAB
	MOVEI B,"/"		;TAB BECOMES SLASH
	JRST DDSPE1

TTYSPE:	PUSHJ P,CTRLBT		;PRINT CONTROL BITS IF PRESENT
	CAIE B,LF
	ADDI H,1		;MOVE OVER ONE COLUMN UNLESS LF OR CR
	CAIN B,CR
	SETZ H,			;BACK AT LEFT MARGIN IF CR
	JUMPE B,NODD		;NO NULLS IF ON TTY
	IDPB B,PTR
	JRST NODD

REPEAT 0,<
	JRST NODD2		;NOT ON DD
;	JRST DDDD	;NOTHING SPECIAL TO DO HERE FOR CRS AND LFS ANY MORE
	CAIN H,12		;WAS LAST CHAR A LF?
	CAIN B,15		;AND IS PRESENT CHAR NOT A CR?
	JRST NODD2		;NO TO ONE
	MOVEI H,15		;WE HAVE A BARE LF
	IDPB H,PTR		;INVENT A CR AND
	MOVEI H,40
	MOVE B,COUNT
	IDPB H,PTR		;SPACE OUT TO COLUMN FROM PREVIOUS LINE
	SOJG B,.-1
NODD2:	CAIN H,15		;PREVIOUS CHAR A CR?
	CAIN A,12		;AND PRESENT CHAR NOT A LF?
	JRST NODD1
	MOVEI H,12		;YES.  INVENT A LF FOR THE CR
	IDPB H,PTR
NODD1:	SKIPG NODPY
	JRST NODD3
	CAIE H,15		;HERE FOR DD ONLY.  PREVIOUS CHAR NOT A CR?
	CAIE B,12		;AND PRESENT CHAR A LF?
	JRST NODD3
	MOVEI H,40		;YES.  PUT A BLANK AND A CR BEFORE THE LF
	IDPB H,PTR
	MOVEI H,15
	IDPB H,PTR
NODD3:	CAIN B,15		;GOT A CR?
	JRST [	MOVEI H,40	;YES
		SKIPN COUNT	;IF NOTHING IN LINE AND
		SKIPG NODPY	; ON DD, THEN
		CAIA
		IDPB H,PTR	; PUT IN A SPACE BEFORE THE CR
		SETZM COUNT	;NOTE THAT WE HAVE NOW A NEW LINE
		JRST .+1]
DDDD:	TRZE A,200		;CONTROL BIT ON?
	IDPB C,PTR		;YES
	TRZE A,400		;META BIT ON?
	IDPB D,PTR		;YES
	SKIPG NODPY
	JRST NODD
	CAIE A,177		;HERE FOR DD ONLY.  GOT A BS OR A TAB?
	CAIN A,11
	JRST .+3		;YES.  PUT OUT A 177
	CAIE A,15
	CAIN A,12		;CR OR LF?
	IDPB G,PTR		;YES.  FORCE DISPLAY OF TB OR BS OR CR OR LF
>;END REPEAT 0

NODD:	CAME F,STAKR
	JRST NOTAKR
	SKIPL NODPY
	JRST TAKR1		;DD OR III
	CAIN B,15		;HERE FOR TTYS ONLY
	JRST [	MOVEI B,12	;DONT SPLIT UP A CR AND A LF--PUT THE LF BACK IN
		IDPB B,PTR
;		SETZ H,
		JRST .+1]
TAKR1:	MOVEI B,[ASCIZ/*** TAKR →→→/]
	PUSHJ P,STRING
	ADDI H,=12	;SETZM COUNT
	JRST FIN

NOTAKR:
REPEAT 0,<
	SKIPLE NODPY
	JRST NOTAK1		;DD
	CAIE H,15
	CAIN H,12
	JRST FIN		;GOT A CR OR LF
NOTAK1:	AOS A,COUNT		;NOTE WE MOVE OUT ONE COLUMN
	CAIG A,80
	JRST FIN
	PUSHJ P,PCRLF
>;END REPEAT 0

FIN:	CAME F,SPUTR
	JRST TLOP
	POPJ P,

PSCRLF:	MOVEI Z," "		;INSERT A SPACE AND A CRLF
	IDPB Z,PTR
PCRLF:	MOVEI Z,CR		;INSERT CRLF
	IDPB Z,PTR
	MOVEI Z,12
	IDPB Z,PTR
	SETZ H,			;NOTE BEGINNING NEW LINE
	AOS LINENO#
	POPJ P,

CTRLBT:	TRZE A,200		;CONTROL BIT ON?
	JRST [IDPB C,PTR↔AOJA H,.+1]	;YES
	TRZE A,400		;META BIT ON?
	JRST [IDPB D,PTR↔AOJA H,.+1]	;YES
	POPJ P,
SIXOUT:	MOVEI C,6
SIX1:	SETZ A,
	LSHC A,6
	ADDI A,40
	IDPB A,PTR
	SOJG C,SIX1
CPOPJ:	POPJ P,

OCTPNT:	MOVEI C,=12
OCT1:	SETZ A,
	LSHC A,3
	ADDI A,60
	IDPB A,PTR
	SOJG C,OCT1
	POPJ P,

OCTNUM:	IDIVI A,10
	HRLM B,(P)
	JUMPE A,.+2
	PUSHJ P,OCTNUM
	HLRZ A,(P)
	ADDI A,60
	IDPB A,PTR
	POPJ P,

DECNUM:	IDIVI A,=10
	HRLM B,(P)
	JUMPE A,.+2
	PUSHJ P,DECNUM
	HLRZ A,(P)
	ADDI A,60
	IDPB A,PTR
	POPJ P,

STRING:	HRLI B,(<POINT 7,0>)
ST1:	ILDB A,B
	JUMPE A,CPOPJ
	IDPB A,PTR
	JRST ST1

DEFINE CW(C1,B1,C2,B2,C3,B3)
{	<BYTE(8)<B1>,<B2>,<B3>(3)<C1>,<C2>,<C3>>!4	}

DDWRD1:	CW	1,46,2,0,3,1
DDWRD2:	CW	4,0,5,10,5,10

IIIWRD:	BYTE(11)<-1000>,670(3)0,0(2)1,2(4)6

HEAD:	600000,,DPYBUF
	0
DONE:	0
	LINSET

DPYBUF:	0
LINSET:	0
HEADER:	ASCID/
DEVNAM  DEVLOG  DEVCHR        DEVIOS        DEVMOD        LINTAB
/
	1
TEXT:	REPEAT 600,<1>
BUFEND:	1
	0
END STRT